package work.jame.blog.framework.limit;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

/**
 * 请求限流
 *
 * 以默认配置同一个接口一秒内最多被同一个用户ip请求1次
 *
 * @author Jame!
 * @date 2023/5/9 下午 11:16
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestLimit {

    /**
     * 设置接口时间段内最大请求次数
     * 默认限制请求1次
     *
     * @return 时间段内请求最大限制次数
     */
    int value() default 1;

    /**
     * 限流时间单位
     * 默认以秒为单位
     *
     * @return 限流时间单位
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /**
     * 限流模式
     * user: 根据用户账号进行限流
     * ip: 根据请求ip进行限流
     * user_ip: 根据用户和ip同时进行限流
     * 默认根据用户ip
     *
     * @return 限流模式
     */
    String mode() default "ip";


    /**
     * 自定义限流处理器,可配置多个
     * 实现RequestLimitHandler接口,将实现类添加到spring容器中
     * @return RequestLimitHandler
     */
    Class<? extends AbstractRequestLimitHandler>[] handlers() default AbstractRequestLimitHandler.class;

}
